<?php

class ProfileFieldController extends Controller {

    /**
     * @var CActiveRecord the currently loaded data model instance.
     */
    private $_model;
    private static $_widgets = array();
    public $defaultAction = 'admin';
    public $layout = '//layouts/user';

    /**
     * @return array action filters
     */
    public function filters() {
        return CMap::mergeArray(parent::filters(), array(
                    'accessControl', // perform access control for CRUD operations
        ));
    }

    /**
     * Specifies the access control rules.
     * This method is used by the 'accessControl' filter.
     * @return array access control rules
     */
    public function accessRules() {
        return array(
            array('allow', // allow all users to perform 'index' and 'view' actions
                'actions' => array('*'),
                'users' => array('*'),
            ),
            array('allow', // allow admin user to perform 'admin' and 'delete' actions
                'actions' => array('create', 'update', 'view', 'admin', 'delete'),
//				'users'=>UserModule::getAdmins(),
                'users' => array('@'),
            ),
            array('deny', // deny all users
                'users' => array('*'),
            ),
        );
    }

    /**
     * Displays a particular model.
     */
    public function actionView() {
        $this->render('view', array(
            'model' => $this->loadModel(),
        ));
    }

    /**
     * Register Script
     */
    public function registerScript() {
        $basePath = Yii::getPathOfAlias('application.modules.user.views.asset');
        $baseUrl = Yii::app()->getAssetManager()->publish($basePath);
        $cs = Yii::app()->getClientScript();
        $cs->registerCoreScript('jquery');
        $cs->registerCssFile($baseUrl . '/css/redmond/jquery-ui.css');
        $cs->registerCssFile($baseUrl . '/css/style.css');
        $cs->registerScriptFile($baseUrl . '/js/jquery-ui.min.js');
        $cs->registerScriptFile($baseUrl . '/js/form.js');
        $cs->registerScriptFile($baseUrl . '/js/jquery.json.js');

        $widgets = self::getWidgets();

        $wgByTypes = ProfileField::itemAlias('field_type');
        foreach ($wgByTypes as $k => $v) {
            $wgByTypes[$k] = array();
        }

        foreach ($widgets[1] as $widget) {
            if (isset($widget['fieldType']) && count($widget['fieldType'])) {
                foreach ($widget['fieldType'] as $type) {
                    array_push($wgByTypes[$type], $widget['name']);
                }
            }
        }
        //echo '<pre>'; print_r($widgets[1]); die();
        $js = "

	var name = $('#name'),
	value = $('#value'),
	allFields = $([]).add(name).add(value),
	tips = $('.validateTips');
	
	var listWidgets = jQuery.parseJSON('" . str_replace("'", "\'", CJavaScript::jsonEncode($widgets[0])) . "');
	var widgets = jQuery.parseJSON('" . str_replace("'", "\'", CJavaScript::jsonEncode($widgets[1])) . "');
	var wgByType = jQuery.parseJSON('" . str_replace("'", "\'", CJavaScript::jsonEncode($wgByTypes)) . "');
	
	var fieldType = {
			'INTEGER':{
				'hide':['match','other_validator','widgetparams'],
				'val':{
					'field_size':10,
					'default':'0',
					'range':'',
					'widgetparams':''
				}
			},
			'VARCHAR':{
				'hide':['widgetparams'],
				'val':{
					'field_size':255,
					'default':'',
					'range':'',
					'widgetparams':''
				}
			},
			'TEXT':{
				'hide':['field_size','range','widgetparams'],
				'val':{
					'field_size':0,
					'default':'',
					'range':'',
					'widgetparams':''
				}
			},
			'DATE':{
				'hide':['field_size','field_size_min','match','range','widgetparams'],
				'val':{
					'field_size':0,
					'default':'0000-00-00',
					'range':'',
					'widgetparams':''
				}
			},
			'FLOAT':{
				'hide':['match','other_validator','widgetparams'],
				'val':{
					'field_size':'10.2',
					'default':'0.00',
					'range':'',
					'widgetparams':''
				}
			},
			'DECIMAL':{
				'hide':['match','other_validator','widgetparams'],
				'val':{
					'field_size':'10,2',
					'default':'0',
					'range':'',
					'widgetparams':''
				}
			},
			'BOOL':{
				'hide':['field_size','field_size_min','match','widgetparams'],
				'val':{
					'field_size':0,
					'default':0,
					'range':'1==" . UserModule::t('Yes') . ";0==" . UserModule::t('No') . "',
					'widgetparams':''
				}
			},
			'BLOB':{
				'hide':['field_size','field_size_min','match','widgetparams'],
				'val':{
					'field_size':0,
					'default':'',
					'range':'',
					'widgetparams':''
				}
			},
			'BINARY':{
				'hide':['field_size','field_size_min','match','widgetparams'],
				'val':{
					'field_size':0,
					'default':'',
					'range':'',
					'widgetparams':''
				}
			}
		};
			
	function showWidgetList(type) {
		$('div.widget select').empty();
		$('div.widget select').append('<option value=\"\">" . UserModule::t('No') . "</option>');
		if (wgByType[type]) {
			for (var k in wgByType[type]) {
				$('div.widget select').append('<option value=\"'+wgByType[type][k]+'\">'+widgets[wgByType[type][k]]['label']+'</option>');
			}
		}
	}
		
	function setFields(type) {
		if (fieldType[type]) {
			if (" . ((isset($_GET['id'])) ? 0 : 1) . ") {
				showWidgetList(type);
				$('#widgetlist option:first').attr('selected', 'selected');
			}
			
			$('div.row').addClass('toshow').removeClass('tohide');
			if (fieldType[type].hide.length) $('div.'+fieldType[type].hide.join(', div.')).addClass('tohide').removeClass('toshow');
			if ($('div.widget select').val()) {
				$('div.widgetparams').removeClass('tohide');
			}
			$('div.toshow').show(500);
			$('div.tohide').hide(500);
			" . ((!isset($_GET['id'])) ? "
			for (var k in fieldType[type].val) { 
				$('div.'+k+' input').val(fieldType[type].val[k]);
			}" : '') . "
		}
	}
	
	function isArray(obj) {
		if (obj.constructor.toString().indexOf('Array') == -1)
			return false;
		else
			return true;
	}
		
	$('#dialog-form').dialog({
		autoOpen: false,
		height: 400,
		width: 400,
		modal: true,
		buttons: {
			'" . UserModule::t('Save') . "': function() {
				var wparam = {};
				var fparam = {};
				$('#dialog-form fieldset .wparam').each(function(){
					if ($(this).val()) wparam[$(this).attr('name')] = $(this).val();
				});
				
				var tab = $('#tabs ul li.ui-tabs-selected').text();
				fparam[tab] = {};
				$('#dialog-form fieldset .tab-'+tab).each(function(){
					if ($(this).val()) fparam[tab][$(this).attr('name')] = $(this).val();
				});
				
				if ($.JSON.encode(wparam)!='{}') $('div.widgetparams input').val($.JSON.encode(wparam));
				if ($.JSON.encode(fparam[tab])!='{}') $('div.other_validator input').val($.JSON.encode(fparam)); 
				
				$(this).dialog('close');
			},
			'" . UserModule::t('Cancel') . "': function() {
				$(this).dialog('close');
			}
		},
		close: function() {
		}
	});


	$('#widgetparams').focus(function() {
		var widget = widgets[$('#widgetlist').val()];
		var html = '';
		var wparam = ($('div.widgetparams input').val())?$.JSON.decode($('div.widgetparams input').val()):{};
		var fparam = ($('div.other_validator input').val())?$.JSON.decode($('div.other_validator input').val()):{};
		
		// Class params
		for (var k in widget.params) {
			html += '<label for=\"name\">'+((widget.paramsLabels[k])?widget.paramsLabels[k]:k)+'</label>';
			html += '<input type=\"text\" name=\"'+k+'\" id=\"widget_'+k+'\" class=\"text wparam ui-widget-content ui-corner-all\" value=\"'+((wparam[k])?wparam[k]:widget.params[k])+'\" />';
		}
		// Validator params		
		if (widget.other_validator) {
			var tabs = '';
			var li = '';
			for (var t in widget.other_validator) {
				tabs += '<div id=\"tab-'+t+'\" class=\"tab\">';
				li += '<li'+((fparam[t])?' class=\"ui-tabs-selected\"':'')+'><a href=\"#tab-'+t+'\">'+t+'</a></li>';
				
				for (var k in widget.other_validator[t]) {
					tabs += '<label for=\"name\">'+((widget.paramsLabels[k])?widget.paramsLabels[k]:k)+'</label>';
					if (isArray(widget.other_validator[t][k])) {
						tabs += '<select type=\"text\" name=\"'+k+'\" id=\"filter_'+k+'\" class=\"text fparam ui-widget-content ui-corner-all tab-'+t+'\">';
						for (var i in widget.other_validator[t][k]) {
							tabs += '<option value=\"'+widget.other_validator[t][k][i]+'\"'+((fparam[t]&&fparam[t][k])?' selected=\"selected\"':'')+'>'+widget.other_validator[t][k][i]+'</option>';
						}
						tabs += '</select>';
					} else {
						tabs += '<input type=\"text\" name=\"'+k+'\" id=\"filter_'+k+'\" class=\"text fparam ui-widget-content ui-corner-all tab-'+t+'\" value=\"'+((fparam[t]&&fparam[t][k])?fparam[t][k]:widget.other_validator[t][k])+'\" />';
					}
				}
				tabs += '</div>';
			}
			html += '<div id=\"tabs\"><ul>'+li+'</ul>'+tabs+'</div>';
		}
		
		$('#dialog-form fieldset').html(html);
		
		$('#tabs').tabs();
		
		// Show form
		$('#dialog-form').dialog('open');
	});
	
	$('#field_type').change(function() {
		setFields($(this).val());
	});
	
	$('#widgetlist').change(function() {
		if ($(this).val()) {
			$('div.widgetparams').show(500);
		} else {
			$('div.widgetparams').hide(500);
		}
		
	});
	
	// show all function 
	$('div.form p.note').append('<br/><a href=\"#\" id=\"showAll\">" . UserModule::t('Show all') . "</a>');
 	$('#showAll').click(function(){
		$('div.row').show(500);
		return false;
	});
	
	// init
	setFields($('#field_type').val());
	
	";
        $cs->registerScript(__CLASS__ . '#dialog', $js);
    }

    /**
     * Creates a new model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     */
    public function actionCreate() {
        $model = new ProfileField;
        $scheme = get_class(Yii::app()->db->schema);
        if (isset($_POST['ProfileField'])) {
            $model->attributes = $_POST['ProfileField'];

            if ($model->validate()) {
                $sql = 'ALTER TABLE ' . Profile::model()->tableName() . ' ADD `' . $model->varname . '` ';
                $sql .= $this->fieldType($model->field_type);
                if (
                        $model->field_type != 'TEXT' && $model->field_type != 'DATE' && $model->field_type != 'BOOL' && $model->field_type != 'BLOB' && $model->field_type != 'BINARY'
                )
                    $sql .= '(' . $model->field_size . ')';
                $sql .= ' NOT NULL ';

                if ($model->field_type != 'TEXT' && $model->field_type != 'BLOB' || $scheme != 'CMysqlSchema') {
                    if ($model->default)
                        $sql .= " DEFAULT '" . $model->default . "'";
                    else
                        $sql .= ((
                                $model->field_type == 'TEXT' || $model->field_type == 'VARCHAR' || $model->field_type == 'BLOB' || $model->field_type == 'BINARY'
                                ) ? " DEFAULT ''" : (($model->field_type == 'DATE') ? " DEFAULT '0000-00-00'" : " DEFAULT 0"));
                }
                $model->dbConnection->createCommand($sql)->execute();
                $model->save();
                $this->redirect(array('view', 'id' => $model->id));
            }
        }

        $this->registerScript();
        $this->render('create', array(
            'model' => $model,
        ));
    }

    /**
     * Updates a particular model.
     * If update is successful, the browser will be redirected to the 'view' page.
     */
    public function actionUpdate() {
        $model = $this->loadModel();
        if (isset($_POST['ProfileField'])) {
            $model->attributes = $_POST['ProfileField'];
            if ($model->save())
                $this->redirect(array('view', 'id' => $model->id));
        }
        $this->registerScript();

        $this->render('update', array(
            'model' => $model,
        ));
    }

    /**
     * Deletes a particular model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     */
    public function actionDelete() {
        if (Yii::app()->request->isPostRequest) {
            // we only allow deletion via POST request
            $scheme = get_class(Yii::app()->db->schema);
            $model = $this->loadModel();
            if ($scheme == 'CSqliteSchema') {
                $attr = Profile::model()->attributes;
                unset($attr[$model->varname]);
                $attr = array_keys($attr);
                $connection = Yii::app()->db;
                $transaction = $connection->beginTransaction();
                $status = true;
                try {
                    $sql = '';
                    $connection->createCommand(
                            "CREATE TEMPORARY TABLE " . Profile::model()->tableName() . "_backup (" . implode(',', $attr) . ")"
                    )->execute();

                    $connection->createCommand(
                            "INSERT INTO " . Profile::model()->tableName() . "_backup SELECT " . implode(',', $attr) . " FROM " . Profile::model()->tableName()
                    )->execute();

                    $connection->createCommand(
                            "DROP TABLE " . Profile::model()->tableName()
                    )->execute();

                    $connection->createCommand(
                            "CREATE TABLE " . Profile::model()->tableName() . " (" . implode(',', $attr) . ")"
                    )->execute();

                    $connection->createCommand(
                            "INSERT INTO " . Profile::model()->tableName() . " SELECT " . implode(',', $attr) . " FROM " . Profile::model()->tableName() . "_backup"
                    )->execute();

                    $connection->createCommand(
                            "DROP TABLE " . Profile::model()->tableName() . "_backup"
                    )->execute();

                    $transaction->commit();
                } catch (Exception $e) {
                    $transaction->rollBack();
                    $status = false;
                }
                if ($status) {
                    $model->delete();
                }
            } else {
                $sql = 'ALTER TABLE ' . Profile::model()->tableName() . ' DROP `' . $model->varname . '`';
                if ($model->dbConnection->createCommand($sql)->execute()) {
                    $model->delete();
                }
            }

            // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
            if (!isset($_POST['ajax']))
                $this->redirect(array('admin'));
        }
        else
            throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.');
    }

    /**
     * Manages all models.
     */
    public function actionAdmin() {
        $model = new ProfileField('search');
        $model->unsetAttributes();  // clear any default values
        if (isset($_GET['ProfileField']))
            $model->attributes = $_GET['ProfileField'];

        $this->render('admin', array(
            'model' => $model,
        ));
        /*
          $dataProvider=new CActiveDataProvider('ProfileField', array(
          'pagination'=>array(
          'pageSize'=>Yii::app()->controller->module->fields_page_size,
          ),
          'sort'=>array(
          'defaultOrder'=>'position',
          ),
          ));

          $this->render('admin',array(
          'dataProvider'=>$dataProvider,
          ));// */
    }

    /**
     * Returns the data model based on the primary key given in the GET variable.
     * If the data model is not found, an HTTP exception will be raised.
     */
    public function loadModel() {
        if ($this->_model === null) {
            if (isset($_GET['id']))
                $this->_model = ProfileField::model()->findbyPk($_GET['id']);
            if ($this->_model === null)
                throw new CHttpException(404, 'The requested page does not exist.');
        }
        return $this->_model;
    }

    /**
     * MySQL field type
     * @param $type string
     * @return string
     */
    public function fieldType($type) {
        $type = str_replace('UNIX-DATE', 'INTEGER', $type);
        return $type;
    }

    public static function getWidgets($fieldType = '') {
        $basePath = Yii::getPathOfAlias('application.modules.user.components');
        $widgets = array();
        $list = array('' => UserModule::t('No'));
        if (self::$_widgets) {
            $widgets = self::$_widgets;
        } else {
            $d = dir($basePath);
            while (false !== ($file = $d->read())) {
                if (strpos($file, 'UW') === 0) {
                    list($className) = explode('.', $file);
                    if (class_exists($className)) {
                        $widgetClass = new $className;
                        if ($widgetClass->init()) {
                            $widgets[$className] = $widgetClass->init();
                            if ($fieldType) {
                                if (in_array($fieldType, $widgets[$className]['fieldType']))
                                    $list[$className] = $widgets[$className]['label'];
                            } else {
                                $list[$className] = $widgets[$className]['label'];
                            }
                        }
                    }
                }
            }
            $d->close();
        }
        return array($list, $widgets);
    }

    /**
     * Get Values for Dependent DropDownList.
     * @author juan.gaviria@dsotogroup.com
     */
    public function actionGetDroDownDepValues() {
        $post = $_POST;
        $model = new $post['model'];
        $data = CHtml::listData($model->findAll($post['varname'] . '=:' . $post['varname'], array(':' . $post['varname'] => $post[$post['varname']])), 'id', $post['optionDestName']);
        echo CHtml::tag('option', array('value' => ''), CHtml::encode('Seleccione...'), true);
        foreach ($data AS $value => $name) {
            echo CHtml::tag('option', array('value' => $value), CHtml::encode($name), true);
        }
    }

    /**
     * Performs the AJAX validation.
     * @param CModel the model to be validated
     */
    protected function performAjaxValidation($model) {
        if (isset($_POST['ajax']) && $_POST['ajax'] === 'profile-field-form') {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
    }

}
